import type { Dto<%=argv.resourceNameCapitalize%>Create, Dto<%=argv.resourceNameCapitalize%>SelectRes, Dto<%=argv.resourceNameCapitalize%>Update, Entity<%=argv.resourceNameCapitalize%> } from 'vona-module-<%=argv.moduleInfo.relativeName%>';
import assert from 'node:assert';
import { describe, it } from 'node:test';
import { app } from 'vona-mock';

describe('<%=argv.resourceName%>.test.ts', () => {
  it('action:<%=argv.resourceName%>', async () => {
    await app.bean.executor.mockCtx(async () => {
      // data
      const data: Dto<%=argv.resourceNameCapitalize%>Create = {
        name: '__Tom__',
        description: 'This is a test',
      };
      const dataUpdate: Dto<%=argv.resourceNameCapitalize%>Update = {
        name: '__TomNew__',
        description: 'This is a test',
      };
      // role-less authenticated users cannot access generated admin actions
      await app.bean.passport.signinMock();
      try {
        app.bean.passport.current!.roles = [];
        const actions = ['create', 'select', 'view', 'update', 'delete'];
        const permissions = await Promise.all(
          actions.map(action =>
            app.bean.permission.retrievePermissionAction(
              '<%=argv.moduleInfo.relativeName%>:<%=argv.resourceName%>',
              action,
            ),
          ),
        );
        assert.deepEqual(permissions, actions.map(() => false));
      } finally {
        await app.bean.passport.signout();
      }
      // login as system admin
      await app.bean.passport.signinMock();
      // create
      const <%=argv.resourceName%>Id = await app.bean.executor.performAction('post', '<%=argv.moduleActionPathRaw%>', { body: data });
      assert.equal(!!<%=argv.resourceName%>Id, true);
      // findMany
      const selectRes: Dto<%=argv.resourceNameCapitalize%>SelectRes = await app.bean.executor.performAction('get', '<%=argv.moduleActionPathRaw%>');
      assert.equal(selectRes.list.findIndex(item => item.name === data.name) > -1, true);
      // update
      const updateRes = await app.bean.executor.performAction('patch', '<%=argv.moduleActionPathRaw%>/:id', {
        params: { id: <%=argv.resourceName%>Id },
        body: dataUpdate,
      });
      assert.equal(updateRes, null);
      // findOne
      let <%=argv.resourceName%>: Entity<%=argv.resourceNameCapitalize%> = await app.bean.executor.performAction('get', '<%=argv.moduleActionPathRaw%>/:id', { params: { id: <%=argv.resourceName%>Id } });
      assert.equal(<%=argv.resourceName%>.name, dataUpdate.name);
      // delete
      const deleteRes = await app.bean.executor.performAction('delete', '<%=argv.moduleActionPathRaw%>/:id', { params: { id: <%=argv.resourceName%>.id } });
      assert.equal(deleteRes, null);
      // findOne
      <%=argv.resourceName%> = await app.bean.executor.performAction('get', '<%=argv.moduleActionPathRaw%>/:id', { params: { id: <%=argv.resourceName%>.id } });
      assert.equal(<%=argv.resourceName%>, undefined);
      // logout
      await app.bean.passport.signout();
    });
  });
});
